
Parallel Routes 讓我們可以在同一個路由底下,切分出多個 page-level 的 chunk,並且由 layout 決定如何渲染這些 chunk。
它讓我們更好的在同一頁面中,管理多塊邏輯獨立的區塊。
像是身份驗證的彈窗、多塊獨立的區塊,或是 conditional render,都可以利用這個 pattern 讓我們撰寫的程式碼更易於閱讀、管理。
有人可能會把 Parallel Routes 與Routes Group 搞混,這兩個完全不一樣,而且可以一起使用
Routes Group 是將 不同的 route 做群組分類
Parallel Routes 則是在 同一個 route 底下,將不同的邏輯區分開來
default

上圖可以看到 @team 與 @analytics 這兩個 folder。
@ 開頭的 folder 不會對路由造成影響,app/@team/page.tsx 實際渲染的路由為 /,這個特殊的檔案夾是用來切分同一個路由底下的不同邏輯區塊。@ 開頭的 folder 都可以建立屬於自己的 loading, error 等任何 app router 允許的保留字檔案。@folder 同一層的 layout 可以解構出與 folder 相同名稱的頁面,決定這些區塊的渲染方式。@folder 後,原本的路由還是可以建立 page,在 layout 中解構出 children 來使用@folder 資料夾@folder 資料夾建立 page 及其他 error, loading 等等的保留字檔案layout 中的 props 取得 folder,並決定如何渲染
folder名稱可以自己定義,layoutprops 中的名稱也會與folder相同
假使我們建立的以下檔案結構
app
|__ @team
|____ page.tsx
|____ loading.tsx
|__ @analytics
|____ page.tsx
|____ loading.tsx
|__ page.tsx
|__ layout.tsx
接著可以在 app/layout.js 中使用 @team、@analautics 與 app/page 這三塊 UI。
export default function Layout(props: {
children: React.ReactNode
analytics: React.ReactNode
team: React.ReactNode
}) {
return (
<>
{props.children}
{props.team}
{props.analytics}
</>
)
}
繼續拿上面的資料夾結構來說,這個資料夾結構只渲染了 / 這個根目錄的路由,只是我們區分了三塊邏輯 @team、@analautics 和預設的 page。
如果建立並訪問了 /dashboard 路由,以 @team 來說,它就會去渲染 app/@team/dashboard/page.tsx 這個 UI。
也就是說只要多建立一個新的路由,就必須為這三個區塊建立對應的 UI,以新增 /dashboard 為例,資料夾結構大概會長成這樣。
app
|__ @team
|____ page.tsx
|____ loading.tsx
|____ dashboard
|______ page.tsx
|__ @analytics
|____ page.tsx
|____ loading.tsx
|____ dashboard
|______ page.tsx
|__ page.tsx
|__ layout.tsx
|__ dashboard
|______ page.tsx
default如果建立了 nested parallel route,但卻有某個 parallel route 沒有建立對應的檔案,此時就會發生 404 錯誤。
我們可以在 parallel route 中建立 default 元件。當頁面渲染時,沒有在對應的 parallel route 找到 page 時,就會顯示 default 的檔案。
以下頁面在訪問 /dashboard 時就不會因為 @analytics 沒有建立對應頁面而直接報錯,它在沒有對應頁面元件時,會渲染 default 的 UI。
app
|__ @team
|____ page.tsx
|____ loading.tsx
|____ dashboard
|______ page.tsx
|__ @analytics
|____ default.tsx
|____ page.tsx
|____ loading.tsx
|__ page.tsx
|__ layout.tsx
|__ dashboard
|______ page.tsx
我還沒搞懂,待補。